﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ComunesMGI.DataTypes;
using System.IO;
using ComunesMGI.Enum;
using ComunesMGI.Excepciones;

namespace MGI.Logica
{
    class CtrIncidentes : IIncidentes
    {

        #region IIncidentes Members

        public List<DataCampo> GetCampos(int idSistema, Lista lista) 
        {
            MgrSistemas mgrSistemas = MgrSistemas.GetInstance();
            DataSistema dataSistema = mgrSistemas.GetSistema(idSistema);
            
            MgrClientes mgrCliente = MgrClientes.GetInstance();
            DataCliente dataCliente = mgrCliente.GetCliente(dataSistema.CodCliente);

            if (mgrCliente.ContainFileCliente(dataCliente.Nombre))

            {
                if (mgrSistemas.ContainFileSistema(dataCliente.Nombre, dataSistema.Nombre))
                {
                    MgrIncidentes mgrIncidentes = MgrIncidentes.GetInstance();
                    List<DataCampo> campos = mgrIncidentes.GetCampos( dataCliente.Nombre, dataSistema ,lista);
                    foreach (DataCampo dataCampo in campos) 
                    {
                        if (dataCampo.Tipo == CampoSharepoint.User)
                        {
                            MgrUsuarios mgrUsuarios = MgrUsuarios.GetInstance();
                            List<DataUsuario> usuarios = mgrUsuarios.GetUsuarios();
                            List<string> nomUsuarios = new List<string>();
                            foreach (DataUsuario usuario in usuarios) 
                            {
                                nomUsuarios.Add(usuario.Nombre);
                            }
                            dataCampo.Opciones = nomUsuarios;
                        }
                    }
                    return campos;
                }
                else
                {
                    throw new Exception("No existe archivo xml para el sistema");
                }
            }
            else
            {
                throw new Exception("No existe carpeta para el cliente del sistema");
            }

        }

        public DataAltaIncidente AddIncidente(DataSistema incidente)
        {
            MgrIncidentes mgrIncidentes = MgrIncidentes.GetInstance();
            return mgrIncidentes.AddIncidente(incidente);
        }

        public List<DataIncidente> GetIncidentes(int idSistema)
        {

            MgrSistemas mgrSistemas = MgrSistemas.GetInstance();
            DataSistema dataSistema = mgrSistemas.GetSistema(idSistema);

            MgrIncidentes mgrIncidentes = MgrIncidentes.GetInstance();
            return mgrIncidentes.GetIncidentes(dataSistema.Sitio);
        }

        public List<DataIncidente> GetIncidentesAsignablesWP(int wkpCod)
        {
            MgrIncidentes mgrIncidentes = MgrIncidentes.GetInstance();
            int idSistema = mgrIncidentes.GetIdSistemaWP(wkpCod);

            MgrSistemas mgrSistemas = MgrSistemas.GetInstance();
            DataSistema dataSistema = mgrSistemas.GetSistema(idSistema);

            return mgrIncidentes.GetIncidentesAsignablesWP(dataSistema.Sitio, wkpCod);
        
        }

        public List<DataTarea> GetTareas(int idSistema, int idIncidente) 
        {
            MgrSistemas mgrSistemas = MgrSistemas.GetInstance();
            DataSistema dataSistema = mgrSistemas.GetSistema(idSistema);

            MgrIncidentes mgrIncidentes = MgrIncidentes.GetInstance();
            return mgrIncidentes.GetTareas(dataSistema.Sitio, idIncidente);
        }

        public bool AsignarResponsable(int idSistema, int idIncidente, DataTarea tarea, DataUsuario usuario) 
        {
            
            MgrSistemas mgrSistemas = MgrSistemas.GetInstance();
            DataSistema dataSistema= mgrSistemas.GetSistema(idSistema);

            MgrIncidentes mgrIncidentes = MgrIncidentes.GetInstance();
            string mail = mgrIncidentes.AsignarResponsable(dataSistema.Sitio, idIncidente, Int32.Parse(tarea.IdTarea), usuario);

            //se deben pasar todos los datos para enviar el mail
            return MgrUsuarios.GetInstance().EnviarMailAsignarTarea(mail, usuario, tarea, idIncidente);

        }

        public int AddWorkPackage(int idSistema, DataWP workPackage)
        {
            MgrIncidentes mgrIncidentes = MgrIncidentes.GetInstance();
            return mgrIncidentes.AddWorkPackage(idSistema, workPackage);
        }

        public List<DataWP> GetWorkPackages(int sisCod) 
        {
            MgrSistemas mgrSistemas = MgrSistemas.GetInstance();
            DataSistema dataSistema = mgrSistemas.GetSistema( sisCod);

            MgrIncidentes mgrIncidentes = MgrIncidentes.GetInstance();
            return mgrIncidentes.GetWorkPackages(dataSistema);

        }

        public void AsociarIncidentesWP(int idSistema, int idWorkPackage, List<int> incidentes)
        {
            MgrSistemas mgrSistemas = MgrSistemas.GetInstance();
            DataSistema dataSistema = mgrSistemas.GetSistema(idSistema);

            MgrIncidentes mgrIncidentes = MgrIncidentes.GetInstance();
            mgrIncidentes.AsociarIncidentesWP(dataSistema.Sitio, idWorkPackage, incidentes);
        }

        public List<DataIncidenteReporte> GetIncidentesCerradosPeriodo(List<int> sistemas, DateTime perFchIni, DateTime perFchFin)
        {
            MgrSistemas mgrSistemas = MgrSistemas.GetInstance();
            List<DataSistema> datosSistemas = new List<DataSistema>();
            foreach (int codSistema in sistemas)
            {
                datosSistemas.Add( mgrSistemas.GetSistema(codSistema));
            }            
            MgrIncidentes mgrIncidentes = MgrIncidentes.GetInstance();
            return mgrIncidentes.GetIncidentesCerradosPeriodo(datosSistemas , perFchIni, perFchFin);
        }

        public List<DataIncidente> GetIncidentesWP(int idSistema, int idWorkPackage)
        {
            MgrSistemas mgrSistemas = MgrSistemas.GetInstance();
            DataSistema dataSistema = mgrSistemas.GetSistema(idSistema);
            
            MgrIncidentes mgrIncidentes = MgrIncidentes.GetInstance();
            return mgrIncidentes.GetIncidentesWP(dataSistema.Sitio, idWorkPackage);
        }

        public bool AdjuntarArchivoIncidente(string nombreArchivo, int idSistema, int idIncidente, string nroTemp)
        {
            MgrSistemas mgrSistemas = MgrSistemas.GetInstance();
            DataSistema dataSistema = mgrSistemas.GetSistema(idSistema);

            MgrIncidentes mgrIncidentes = MgrIncidentes.GetInstance();
            return mgrIncidentes.AdjuntarArchivoIncidente(nombreArchivo, dataSistema.Sitio, idIncidente, nroTemp);
        }


        public DataAltaTarea AddTarea(int idSistema, int idIncidente, List<DataCampo> campos)
        {
            MgrSistemas mgrSistemas = MgrSistemas.GetInstance();
            DataSistema dataSistema = mgrSistemas.GetSistema(idSistema);

            MgrIncidentes mgrIncidentes = MgrIncidentes.GetInstance();
            return mgrIncidentes.AddTarea(dataSistema.Sitio, idIncidente, campos);
        }


        public string UploadFile(Stream sourceStream) 
        {
            MgrIncidentes mgrIncidentes = MgrIncidentes.GetInstance();
            return mgrIncidentes.UploadFile(sourceStream);
        }


        public List<DataEstadoWP> GetEstadosWP()
        {
            MgrIncidentes mgrIncidentes = MgrIncidentes.GetInstance();
            return mgrIncidentes.GetEstadosWP();
        }

        public List<DataIncidenteReporte> VisualizarIncidentesAsignados(int idSistema, string usuario, DateTime perFchIni, DateTime perFchFin) 
        {
            MgrSistemas mgrSistemas = MgrSistemas.GetInstance();
            DataSistema dataSistema = mgrSistemas.GetSistema(idSistema);

            MgrIncidentes mgrIncidentes = MgrIncidentes.GetInstance();
            return mgrIncidentes.VisualizarIncidentesAsignados(dataSistema, usuario, perFchIni, perFchFin);
        }


        public bool ChkWpIncidentesOTareasSinCerrar(int wkpCod)
        {
            MgrIncidentes mgrIncidentes = MgrIncidentes.GetInstance();
            int idSistema = mgrIncidentes.GetIdSistemaWP(wkpCod);
        
            MgrSistemas mgrSistemas = MgrSistemas.GetInstance();
            DataSistema dataSistema = mgrSistemas.GetSistema(idSistema);


            return mgrIncidentes.ChkWpIncidentesOTareasSinCerrar(dataSistema.Sitio, wkpCod);
        }

        public void ModificarWP(DataWP wp, bool cerrarTodo)
        {
            MgrIncidentes mgrIncidentes = MgrIncidentes.GetInstance();
            int idSistema = mgrIncidentes.GetIdSistemaWP(wp.Id);
            
            MgrSistemas mgrSistemas = MgrSistemas.GetInstance();
            DataSistema dataSistema = mgrSistemas.GetSistema(idSistema);

            DataWP estadoPrevio = mgrIncidentes.GetWPPorId(wp.Id);
            mgrIncidentes.ModificarWP(wp);
            if(wp.Estado.Final && cerrarTodo)
            {
                try
                {
                    mgrIncidentes.CerrarAsociadosWP(dataSistema.Sitio, wp.Id);
                }
                catch(Exception e)
                {
                    mgrIncidentes.ModificarWP(estadoPrevio);
                    throw new SPConeccionFallida("Error en SharePoint, no se han realizado los cambios");
                }
                
            }
        }

        #endregion

    }
}
